package com.example.file.mail;

import sun.misc.BASE64Encoder;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;

public class SendMessageMail {
    public static void send(Mail mail) throws AddressException, MessagingException {
        Properties props = new Properties();  // 存储连接邮件服务器参数
        props.put("mail.smtp.host", Mail.HOST); //smtp主机
        props.put("mail.smtp.auth", "true");//身份验证，目前免费邮件服务器都需要这一项

        /** props对象构建一个邮件session
         * Session类代表JavaMail中的一个邮件会话。
         * 每一个基于JavaMail的应用程序至少有一个Session（可以有任意多的Session）
         * JavaMail需要Properties来创建一个session对象
         */
        Session session = Session.getDefaultInstance(props);
        // 有了这句便可以在发送邮件的过程中的Console处显示过程信息，供调试使用，（你可以在控制台-console上看到发送邮件的过程）
        session.setDebug(false);
        /**
         * Message对象将存储我们实际发送的电子邮件信息，
         * Message对象被作为一个MimeMessage对象来创建。
         */
        MimeMessage message = new MimeMessage(session);
        // 加载发件人地址
        message.setFrom(new InternetAddress(Mail.USER));

//        设置接收方地址使用addRecipient方法，地址类型有三种：
//        RecipientType.TO:e-mail的发送地址；
//        RecipientType.CC:抄送地址，可以为多个；
//        RecipientType.BCC:暗送地址，可以为多个。
        if("" != mail.getTo()){
            // 加载收件人地址
            String toOt[] = mail.getTo().split(";");
            InternetAddress[] sendTo = new InternetAddress[toOt.length];
            for (int i = 0; i < toOt.length; i++) {
                System.out.println("发送到：" + toOt[i]);
                //InternetAddress类通过一个合法的e-mail构造出e-mail地址对象
                message.addRecipient(Message.RecipientType.TO, new InternetAddress(toOt[i].toString()));
            }
        }
        //抄送
        if("" != mail.getToOther() && null != mail.getToOther()){
            // 加载抄送人地址
            String toOt[] = mail.getToOther().split(";");
            InternetAddress[] sendTo = new InternetAddress[toOt.length];
            for (int i = 0; i < toOt.length; i++) {
                System.out.println("抄送到：" + toOt[i]);
                sendTo[i] = new InternetAddress(toOt[i]);
            }
            message.addRecipients(Message.RecipientType.CC, sendTo);   // 抄送人地址
        }else{
            System.out.println("没有抄送人");
        }
        //邮件标题
        message.setSubject(mail.getSubject());

        // 向multipart对象中添加邮件的各个部分内容，包括文本内容和附件
        MimeMultipart msgMultipart = new MimeMultipart("mixed");
//		message.setContent(msgMultipart);
        //添加正文(文本或html)
        MimeBodyPart content = new MimeBodyPart();
        content.setContent(mail.getComment(),"text/html;charset=utf-8");
        msgMultipart.addBodyPart(content);

        //发送附件
        if (null != mail.getAffixUrl() && !"".equals(mail.getAffixUrl())) {
            // 添加附件
            BodyPart affixPart = new MimeBodyPart();
            //DataSource类表示本地文件和服务器可以直接访问的资源，它是一个抽象类，用其子类FileDataSource来创建。
            DataSource source = new FileDataSource(mail.getAffixUrl());
            // 添加附件的内容，附件被封装到一个DataHandler对象
            affixPart.setDataHandler(new DataHandler(source));
            // javamail支持对base64编码的邮件解码，添加附件的标题 **这里很重要，通过下面的Base64编码的转换可以保证你的中文附件标题名在发送时不会变成乱码
            BASE64Encoder enc = new BASE64Encoder();
            // affixPart.setFileName("=?utf-8?B?"+enc.encode(affixName.getBytes())+"?=");   MimeUtility
            //MimeUtility.encodeWord可以避免文件名乱码
            affixPart.setFileName("PdfDemoNew0.pdf");
            System.err.println(mail.getSubject() + "邮件发送附件中……");
            msgMultipart.addBodyPart(affixPart);

        }

        // 将multiPart对象放到message中
        message.setContent(msgMultipart);
        // 保存邮件
        message.saveChanges();
        /**发送邮件
         * 邮件是既可以被发送也可以被受到。JavaMail使用了两个不同的类来完成这两个功能：Transport 和 Store。
         * Transport 是用来发送信息的，而Store用来收信。对于这的教程我们只需要用到Transport对象。
         */
        Transport transport = session.getTransport("smtp");
        // 链接服务器的邮箱
        transport.connect(Mail.HOST, Mail.USER,Mail.PASSWORD);
        // 把邮件发送出去
        System.err.println(mail.getSubject() + "邮件发送中……");
        transport.sendMessage(message, message.getAllRecipients());
        transport.close();
        System.err.println(mail.getSubject() + "邮件发送成功");
    }


    public static void main(String[] args) throws MessagingException {
        Mail mail = new Mail();
        mail.setTo("350895484@qq.com");
        mail.setSubject("测试");
        mail.setComment("hello!");
        mail.setAffixUrl(SendMessageMail.class.getResource("/static/excel/PdfDemoNew0.pdf").getPath());
        Mail.SendMail(mail);
    }

}